import { isObject, isString } from './is';
export const formatDate:any = (
    time: string | number | Date,
    format = 'yyyy-MM-dd',
    options = {
      firstDayOfYear: false,
      firstDayOfMonth: false,
      firstDayOfSeason: false,
      firstWeekOfDay: false,
    },
  ) => {
    if (!time) return '';
    time = time || new Date();
    let date;
    if (isString(time) && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(time)) {
      date = new Date(time);
    } else if (isString(time) && /^[0-9]*$/.test(time)) {
      date = new Date(Number(time));
    } else if (isString(time) && time.includes(' ') && time.includes('-')) {
      date = new Date(time.replace(/-/g, '/'));
    } else if (
      isString(time) &&
      (time.includes('年') || time.includes('月') || time.includes('日'))
    ) {
      date = new Date(time.replace(/[年月日]/g, '/'));
    } else {
      date = new Date(time);
    }
    if (options) {
      // 获取当月第一天
      if (options.firstDayOfMonth) {
        return date.setDate(1) && formatDate(date, format);
      }
      // 获取当季第一天
      if (options.firstDayOfSeason) {
        const month = date.getMonth();
        if (month < 3) {
          date.setMonth(0);
        } else if (month > 2 && month < 6) {
          date.setMonth(3);
        } else if (month > 5 && month < 9) {
          date.setMonth(6);
        } else if (month > 8 && month < 11) {
          date.setMonth(9);
        }
        date.setDate(1);
        return formatDate(date, format);
      }
      // 获取当年第一天
      if (options.firstDayOfYear) {
        return date.setDate(1) && date.setMonth(0) && formatDate(date, format);
      }
      // 获取本周第一天
      if (options.firstWeekOfDay) {
        const weekday = date.getDay() || 7; // 获取星期几,getDay()返回值是 0（周日） 到 6（周六） 之间的一个整数。0||7为7，即weekday的值为1-7
        date.setDate(date.getDate() - weekday + 1); // 往前算（weekday-1）天，年份、月份会自动变化
        return formatDate(date, format);
      }
    }
    const dateObj = {
      'M+': date.getMonth() + 1, // 月份
      'd+': date.getDate(), // 日
      'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
      'H+': date.getHours(), // 小时
      'm+': date.getMinutes(), // 分
      's+': date.getSeconds(), // 秒
      'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
      'S+': date.getMilliseconds(), // 毫秒
    };
    const week = {
      0: '\u65e5',
      1: '\u4e00',
      2: '\u4e8c',
      3: '\u4e09',
      4: '\u56db',
      5: '\u4e94',
      6: '\u516d',
    };
    if (/(y+)/i.test(format)) {
      format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    }
    if (/(E+)/.test(format)) {
      //@formatter:off
      format = format.replace(
        RegExp.$1,
        (RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '\u661f\u671f' : '\u5468') : '') +
        //@ts-ignore
          week[date.getDay() + ''],
      );
      //@formatter:on
    }
    for (const k in dateObj) {
      if (
        Object.prototype.hasOwnProperty.call(dateObj, k) &&
        new RegExp('(' + k + ')').test(format)
      ) {
        format = format.replace(
          RegExp.$1,
          //@ts-ignore
          RegExp.$1.length === 1 ? dateObj[k] : ('00' + dateObj[k]).substr(('' + dateObj[k]).length),
        );
      }
    }
    return format;
  };